package org.example.hesitate;

import lombok.extern.slf4j.Slf4j;

/**
 * @author zhengdp
 * @Description 犹豫模式
 * @Date 2022/11/10 21:53
 * @Created by zhengdp
 */
@Slf4j(topic = "c.HesitateToModelTest")
public class HesitateToModelTest {
    public static void main(String[] args) {
        TowPhaseTermination tpt = new TowPhaseTermination();
        tpt.start();
        tpt.start();
        tpt.start();
        tpt.start();
        tpt.start();

    }

    static class TowPhaseTermination {
        private Thread monitor;

        private volatile boolean stop = false;

        private boolean starting = false;

        /**
         * 启动监控线程
         */
        public void start(){
            // 在多线程执行的时候，可能会因为 非原子性 + 线程上下文切换的原因
            // 导致 没有挡住 （其实跟单例模式很像 -- > 双重检测所锁）
            synchronized (this){
                if(starting){
                    return;
                }
                starting = true;
            }
            monitor = new Thread(() -> {
                while(true){
                    Thread current = Thread.currentThread();
                    if(stop){
                        log.info("监控线程被打断，进行停止前的操作");
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                        log.info("执行监控记录");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });

            monitor.start();
        }

        /**
         * 停止监控线程
         */
        public void stop(){
            stop = true;
        }
    }

}


